#ifndef WIDGET_H
#define WIDGET_H

#include <QFinalState>
#include <QLabel>
#include <QLineEdit>
#include <QStateMachine>
#include <QWidget>

#include "dialog_login.h"
#include "dialog_configsystermparas.h"
#include "dialog_configworkgroupparas.h"
#include "dialog_selectworkgroup.h"
#include "dialog_lightcontrol.h"
#include "dialog_camadjust.h"
#include "dialog_inputcode.h"
#include "dialog_codescanstart.h"
#include "serialporthandler.h"
#include "modbusserialtest.h"
#include "inimanager.h"

#include "myStateMachine.h"
#include "SerialPort.h"
#include "ValueProcessor.h"

class myStateMachine;

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    Ui::Widget *ui; // 改成公有，方便myStateMachine类访问

    uint16_t ModbusCRC16(QByteArray senddata);// CRC校验

    void initGroupData();// 初始化用户组数据
    void InitEntIPPort();   // 初始化IP端口
    QString ensureThreeDigits(const QString &input);    //返回三位整形数字符串
public slots:
    // 串口发送
    // 光源 顶部、侧面
    void sendTopRoSideLightAdjustData(QString dat);

    // 光源 底部、侧面补光
    void sendBottomLightAdjustData(QString dat);

    // 镜头 顶部
    void getTopAdjustData(QByteArray dat);

    // 镜头 侧面
    void getSideAdjustData(QByteArray dat);

    // 获取当前选中工作组数据，更新Map
    void GetCurrentGroupData();

    // 设置当前工作组尺寸
    void do_setCurrentGroupSize(QString groupSize);
    // 设置当前工作组编号
    void do_setCurrentGroupName(QString groupName);


    // 其他暂时保留
    // 打印产品码，启动PLC
    void do_checkCode(QString code);

    // 设置当前工作组信息
    void do_setCurrentGroupData(const QMap<QString, QString> map_group);


signals:

//    void sendLightSData(const QString sData);

    void sendCurrentWorkGroupData(const QMap<QString, QString> map);

    // 发送 产品类别到新增参数
    void sendProductClassNewGroup(const QString &productClass);
private:

    // 颜色的枚举类
    enum class StatusColor {
        Error = 0xFF6347,    // 番茄红色 (Tomato)
        Normal = Qt::black,  // 黑色
        Success = 0x32CD32,  // 酸橙绿色 (Lime Green)
        Warning = 0xFFD700,  // 金色
        Other = 0x696969    // 深灰色 (Dim Gray)
    };


    // 串口
    SerialPortHandler top_side_light_sport, top_cam_focus_sport, bottom_light_sport, side_cam_focus_sport;
    ModbusSerialTest plc_port; // plc端口

    bool m_portGlobalFlag = false;

    static bool device_switch_flag; // 设备启停标志位
    bool plc_state_flag = false;    // plc连接标志位

    QStringList currentSteps;    // 当前状态

    bool m_switchHandOperFlag = false;    // 手动操作标志位

    QMap<QString, QString> map_currentGroup;    // 当前组字典

    uint16_t plcStateBit = 0;   // plc状态位

    bool m_nextStateFlag = true;    // 下一个状态标志位

    bool m_btnStopFlog = false;  // 停止标志位

    bool m_getHttpCsvFlag = true;
    uint8_t m_getHttpCsvTime_S = 6; // 6 秒钟获取一次

    HttpRequest *m_http = nullptr; // http

    bool m_productCodeFlag = false; // 产品码标志位

    QString m_productUniqueCode;    // 产品码

    uint16_t m_plc_topPhotoRequest; // PLC顶部拍照请求

    uint16_t m_plc_ABCD_PhotoRequest; // PLC侧边ABCD面拍照请求

    uint16_t m_plc_bottomPhotoRequest; // PLC底部面拍照请求

    bool m_topPhotoFinishFlag = false; // 顶部拍照完成标志位
    bool m_AsidePhotoFinishFlag = false; // A面拍照完成标志位
    bool m_BsidePhotoFinishFlag = false; // B面拍照完成标志位
    bool m_CsidePhotoFinishFlag = false; // C面拍照完成标志位
    bool m_DsidePhotoFinishFlag = false; // D面拍照完成标志位
    bool m_bottomPhotoFinishFlag = false; // 顶部拍照完成标志位

    int PHOTO_TIME_DELAY = 3; // 拍照延时 3秒


    QString m_productCode;  // 产品码

    iniManager *m_iniManager = nullptr;

    QString m_systemVersion = "V1.0"; // 系统软件版本

    QString m_configFileName = "systemConfig.ini"; // 系统配置文件名称

    ValueProcessor processor;
///////////////////////////////////////////////////////////////////////////////////////////////////////
//状态机
///////////////////////////////////////////////////////////////////////////////////////////////////////

public:

    // 初始化状态机
    void MyStateMachineInit();

    // 清理状态机资源
    void deleteStateMachine();


    QMap<QString, QVariant> parseCsvToMap(const QString &csvString);
signals:
    void toNextState(); // 跳转下一个状态

    void toStateWork(); // 调用当前工作任务

    void toResetStatus();// 跳转复位状态


    // 更新设备当前宽窄
    void plcChainWidthCurrentSize(const QString &ChainWidthCurrentSize);

private slots:
    // 登录窗口
    void showLoginDialog();

    // 工作组配置窗口
    void on_btn_configWorkGroup_clicked();

    // 系统配置窗口
    void on_btn_systemConfig_clicked();

    // 光源调节窗口
    void on_btn_LightSourceControl_clicked();

    // 镜头调节窗口
    void on_btn_camAdjust_clicked();

    // 获取任务
    void on_btn_switch_clicked();

    // 更新PLC状态码
    void do_updatelatestStatusCode(const uint16_t statusCode);

    // 停止获取
    void on_btn_Stop_clicked();



//    template<typename Callable>
//    void setTimeout(Callable &&func, int interval);
public slots:
    void do_initTopFocus(); // 顶部相机镜头焦距初始化
    void do_initSideFocus();// 侧面相机镜头焦距初始化

    void sendSideFormSetData(int angle);// 侧面相机
    void sendTopFormSetData(int angle); // 顶部相机

//    void sendSideFormSetData(uint16_t angle);// 侧面相机
//    void sendTopFormSetData(uint16_t angle); // 顶部相机

    // 状态机输出计时器
    void onTimeoutStateMachine();
    // 关闭所有串口
    void do_closeSerialPort();
    // 初始化所有串口
    void do_initSerialPort();

    // 设置所有输入框字体颜色
    void do_setAllSensorShowTextColor(const QString &text, StatusColor status);

    // 工作组配置窗口（自动带入产品类别，跳转新增页面）
    void do_btn_configWorkGroup_clicked(const QString &productClass);

    // 设置顶部拍照焦距、光源
    void setTopCamFocusLight(const int focus, const uint8_t light);

    // 设置底部拍照焦距、光源
    void setSideCamFocusLight(const int focus, const uint8_t light, const uint8_t fill);

    // 设置底部相机光源
    void setBottomCamLight(const uint8_t light);

    // 设置所有光源
    void setLightAll(uint8_t light);


    // 拍照
    void do_TopPhoto();
    void do_AFacePhoto();
    void do_BFacePhoto();
    void do_CFacePhoto();
    void do_DFacePhoto();
    void do_BottomPhoto();

    // 更新工作组
    void do_updatePlcGroupData(QString productUniqueCode);

    // 新增配方
    void do_showAddWorkGroup(QString productClass);

    // 更新当前组下标
    void do_updateCurrentGroup(QString groupId);

    // 初始化焦距
    void do_initFocus();

    // 顶部光源
    void do_setTopLight(uint8_t value);

    // 侧面光源
    void do_setSideLight(uint8_t value);

    // 侧面补光
    void do_setFillLight(uint8_t value);

    // 底部光源
    void do_setBottomLight(uint8_t value);

    // 所有光源
    void do_setAllLight(uint8_t value);

    // 弹出提示框
    bool do_questionPopup(const QString &text);
public:
    // 获取int32转ByteArray.size(4)
    QByteArray intToByteArray(int value);

    // 获取镜头焦距协议数据帧（速度100，分辨率16384）
//    QByteArray formSetAngleData(int16_t angle);
    QByteArray formSetAngleData(int angle);



    // 更新设备端口连接状态
    void updatePortConnectStatus();

    // 读取步骤文件（28状态位）
    QStringList readStepsFromFile(const QString &fileName);

    // 工作组同步更新到plc
    void updatePlcGroupData(const QString &groupName);

    // 获取颜色
    QColor getColor(StatusColor status);

    // 设置控件字体颜色（QLineEdit, QLabel）
    template<typename T>
    void setTextColor(T *widget, const QString &text, StatusColor status);

    // 初始化所有控件字体颜色
    void iniTextColor(StatusColor status);

    // 生成并返回格式化的数据字符串 (0000)
    QString getDataString(uint8_t light);

    // 清除所有标志位
    void clearAllFlag();
private:
    // 状态机定时器
    QTimer *StateMachineTimer = nullptr;

//    uint8_t m_timeCountFinishVal = 5;   // 旋转延时时间
    bool m_checkPortFlag = false; // 端口连接标志位
    uint8_t m_checkPortTime = 6;  // 端口状态检测更新时间
//    bool m_checkPlcFlag = false; // plc连接标志位
    bool m_checkHttpFlag = false; // http连接标志位

    myStateMachine *m_stateMachine = nullptr;

    friend class myStateMachine; // 允许myStateMachine访问私有成员


};
#endif // WIDGET_H
